package main

import (
	"fmt"
	"io/ioutil"
)

// 程序中的数据结构如下，是一个包含以下字段的结构:
// type Page struct {
//     Title string
//     Body  []byte
// }
// 请给这个结构编写一个 save() 方法，将 Title 作为文件名、Body 作为文件内容，写入到文本文件中。
// 再编写一个 load() 函数，接收的参数是字符串 title，该函数读取出与 title 对应的文本文件。
// 请使用 *Page 做为参数，因为这个结构可能相当巨大，我们不想在内存中拷贝它。
// 请使用 ioutil 包里的函数（参考章节 12.2.1）。

type Page struct {
	Title string
	Body  []byte
}

// func (p *Page) save() {
// 	file, err := os.OpenFile(p.Title, os.O_WRONLY|os.O_CREATE, 0666)
// 	if err != nil {
// 		fmt.Fprintf(os.Stderr, "%v Open File(%s) Fail: %s\n", os.Args[0], p.Title, err.Error())
// 		os.Exit(1)
// 	}
// 	defer file.Close()

// 	writer := bufio.NewWriter(file)
// 	_, err = writer.Write(p.Body)
// 	if err != nil {
// 		fmt.Fprintf(os.Stderr, "File Writer Faile: %s\n", err.Error())
// 		os.Exit(1)
// 	}
// 	writer.Flush()
// }

// func load(title string) (p *Page, err error) {
// 	body, err := ioutil.ReadFile(title)
// 	if err != nil {
// 		return
// 	}
// 	// var p *Page has no pointer
// 	p = new(Page)
// 	p.Title = title
// 	p.Body = body
// 	return
// }

func (p *Page) save() error {
	return ioutil.WriteFile(p.Title, p.Body, 0666)
}

func (p *Page) load(title string) (err error) {
	p.Title = title
	p.Body, err = ioutil.ReadFile(title)
	return
}

func main() {
	p := new(Page)
	p.Title = "Truth"
	p.Body = []byte("you can see the sun rise at tomorrow.")
	p.save()

	page := new(Page)
	err := page.load(p.Title)
	if err != nil {
		fmt.Println("Load File error: ", err)
		return
	}
	fmt.Println(string(page.Body))
}
